status = ia64_pal_freq_ratios(&r9,&r10,&r11);
break;
case PAL_PTCE_INFO:
- status = ia64_get_ptce(&r9);
+ {
+ ia64_ptce_info_t ptce;
+ status = ia64_get_ptce(&ptce);
+ if (status != 0) break;
+ r9 = ptce.base;
+ r10 = (ptce.count[0]<<32)|(ptce.count[1]&0xffffffffL);
+ r11 = (ptce.stride[0]<<32)|(ptce.stride[1]&0xffffffffL);
+ }
break;
case PAL_VERSION:
status = ia64_pal_version(&r9,&r10);
status = ia64_pal_register_info(in1,&r9,&r10);
break;
case PAL_CACHE_FLUSH:
- return pal_emulator_static(index); /* FIXME */
+ /* FIXME */
+ printk("PAL_CACHE_FLUSH NOT IMPLEMENTED!\n");
+ BUG();
break;
case PAL_PERF_MON_INFO:
{
unsigned long pm_buffer[16];
+ int i;
status = ia64_pal_perf_mon_info(pm_buffer,&r9);
- if (status != 0) break;
+ if (status != 0) {
+ while(1)
+ printk("PAL_PERF_MON_INFO fails ret=%d\n",status);
+ break;
+ }
if (copy_to_user((void __user *)in1,pm_buffer,128)) {
+ while(1)
printk("xen_pal_emulator: PAL_PERF_MON_INFO "
"can't copy to user!!!!\n");
status = -1;
+ break;
}
+ printk("PAL_PERF_MON_INFO succeeds! r9=%lx\n",r9);
+ for (i=0; i<16;i++)
+ printk("pm_buffer[i]=%lx\n",pm_buffer[i]);
}
break;
case PAL_CACHE_INFO:
}
break;
case PAL_VM_TR_READ: /* FIXME: vcpu_get_tr?? */
+ printk("PAL_VM_TR_READ NOT IMPLEMENTED, IGNORED!\n");
break;
case PAL_HALT_INFO: /* inappropriate info for guest? */
+ printk("PAL_HALT_INFO NOT IMPLEMENTED, IGNORED!\n");
break;
default:
printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n",
// if reg > 3
switch(reg) {
case 0:
- case 1:
memcpy(pval,"Xen/ia64",8);
break;
+ case 1:
+ *pval = 0;
+ break;
case 2:
*pval = 0;
break;
case 3:
- *pval = 0; //FIXME: See vol1, 3.1.11
+ *pval = ia64_get_cpuid(3);
break;
case 4:
- *pval = 1; //FIXME: See vol1, 3.1.11
+ *pval = ia64_get_cpuid(4);
break;
default:
- *pval = 0; //FIXME: See vol1, 3.1.11
+ if (reg > (ia64_get_cpuid(3) & 0xff))
+ return IA64_RSVDREG_FAULT;
+ *pval = ia64_get_cpuid(reg);
break;
}
return (IA64_NO_FAULT);